perm filename PRESCN.F4[NEW,LCS]3 blob
sn#361311 filedate 1978-06-14 generic text, type T, neo UTF8
C**PRESCN, CROCT, CROCX, UPMK, ONEUP, NUMS, LETS, ISGN, I2A, A2I
C** UPLIST. LETNUM. UPCNT, OUTX, ICHAR, TYPARY
SUBROUTINE PRESCN
COMMON NONO(29),JB(6),JP(1),J2,J3,J4,J5,JN,J,JJ
1 /MKX/KSLA,ISEMI,LESS,IGT,LBRK,IRBRK,NNO(3),MINUS
1/DPY/ST(2190),ICRS(5),IOCT(5),NTS(600),IRH(400),IM(200),
1 IB(200),ISL(200) /ALF/I(73) /MKS/MKS(14)
1 /JCHAR/IXX,ISEMX,IBLA,IG /IDEV/IDEV
1 /SCX/ICOM,MINU,IDOT,IEQ,LPRN,IRPRN,IPLUS,ISTAR,ICOLON
COMMON/A2Z/LAA,LBB,LCC,LDD,LEE,LFF,LGG,LHH,LII,LJJ,LKK,LEL,
1 LMM,LNN,LOH,LPP,LQQ,LRR,LSS,LTT,LUU,LVV,LWW,LXX,LYY,LZZ
CC EQUIVALENCE (IOO,MKS(14)),(IR,MKS(13)),(IP,MKS(11)),(IA,MKS(2))
EQUIVALENCE (J1,JP(1))
IF(IDEV.EQ.5)GO TO 401
CALL TYPSTR('***** READING FILE *****')
CALL TYPCRLF
401 CALL OFILE(23,'MODE2')
400 DO 402 K=1,6
JB(K)=0
402 JP(K)=0
JN=0
N=0
DO 300 K=1,200
IM(K)=0
300 ISL(K)=0
100 IF(N.NE.ISEMI)GO TO 500
CALL TYPSTR('NOTES: ')
CALL OUTIT(NTS,J1)
CALL TYPSTR('RHYTHM: ')
CALL OUTIT(IRH,J2)
CALL TYPSTR('MARKS: ')
CALL OUTIT(IM,J3)
CALL TYPSTR('BEAMS: ')
CALL OUTX(IB,J4)
CALL TYPSTR('SLURS: ')
CALL OUTX(ISL,J5)
C NOW START ANOTHER STAFF.
GO TO 400
500 CALL READ(LND)
IF(LND)RETURN
CCC IF(I(1).EQ.'I')GO TO 50
C 'I' IS FOR 'INSERT' FEATURE
J=0
201 JX=0
200 J=J+1
IF(J.GT.LND)GO TO 100
N=I(J)
IF(N.EQ.IBLA)GO TO 200
JJ=J
C JJ= PTR TO START OF ITEM
GO TO(1,2,3,7,8,9,10)LETNUM(N)
C FINDS LETTER, NUM., / OR ;, < OR >, [ OR ], ( , )
1 JC=I(J+1)
IF(N.GT.LGG)GO TO 20
C JUMP IF NOT SCALE LETTER
IF(N.EQ.LBB.AND.JC.EQ.LAA)GO TO 21
C JUMP IF BA (=BASS CLEF)
IF(N.EQ.LAA.AND.JC.EQ.LEL)GO TO 21
C JUMP IF AL (=ALTO CLEF)
C*********↓↓↓↓↓↓↓↓↓↓↓↓*********************
IF(N.NE.LCC)GO TO 22
IF(JC.EQ.IPLUS.OR.JC.EQ.MINUS.OR.JC.EQ.LXX)GO TO 80
C JUMP FOR CRESC. (C+), DECRESC. (C-), OR END OF ONE OF THEM (CX)
C*********↑↑↑↑↑↑↑↑↑↑↑↑*********************
22 JX=1
122 N=ICHAR(J)
IF(NUMS(N))GO TO 122
IF(LETS(N))GO TO 122
IF(N.EQ.ICOLON)GO TO 122
IF(N.EQ.MINUS)GO TO 122
IF(N.EQ.IPLUS)GO TO 122
CC IF(N.EQ.IBLA)GO TO 23
CC IF(N.EQ.KSLA)GO TO 23
CC IF(N.NE.ISEMI)GO TO 22
23 J=J-1
C NOW WE HAVE A NOTE
CALL UPLIST(NTS,J1)
GO TO 200
20 IF(N.NE.LRR)GO TO 21
JX=0
IF(I(J+1).EQ.LEE)GO TO 301
C JUMP FOR 'REP' CODE
GO TO 122
21 IF(N.EQ.LPP)GO TO 22
IF(N.NE.LOH)GO TO 121
C P=PROX., O=ORDIN. BOTH ARE FOLLOWED BY NOTES. O+ = OTTAVA
IF(JC.EQ.IPLUS)GO TO 85
IF(JC.EQ.LXX)GO TO 86
GO TO 22
121 N=ICHAR(J)
IF(N.NE.KSLA.AND.N.NE.ISEMI)GO TO 121
C NOW WE'VE FOUND /TR/ /SU/ K2F/ ETC.
CALL UPLIST(NTS,J1)
GO TO 201
2 N=ICHAR(J)
12 IF(NUMS(N))GO TO 2
25 J=J-1
CCC IF(I(J).EQ.'0')I(J)=LGG
28 CALL UPLIST(IRH,J2)
GO TO 200
3 CALL ONEUP(NTS,J1,N)
CALL ONEUP(IRH,J2,N)
C PUT IN THE / OR ;
IF(JX.NE.0)JN=JN+1
GO TO 200
C SLURS
9 ISL(J5+1)=ISGN(J)
J5=J5+2
M=-1
GO TO 24
10 N=J5
C SLUR END POINT
110 IF(ISL(N).EQ.0)GO TO 109
N=N-2
C ADD AN ERROR TRAP HERE
GO TO 110
109 ISL(N)=JN+1
GO TO 200
C BEAMS
8 IF(I(J+2).EQ.IRBRK)GO TO 4
J4=J4+1
IB(J4)=ISGN(J)
M=0
24 IF(NUMS(I(J+1)).EQ.0)GO TO 200
C JUMP OUT IF NO NUMB. FOLLOWS [ OR (
N=ICHAR(J)
CALL A2I(J,N)
C GO CHANGE ASCII TO INTEGER
L=N+JN
IF(M)GO TO 34
CALL ONEUP(IB,J4,L)
GO TO 200
34 IF(N.LT.96)GO TO 35
C NEXT FOR SLURS BEFORE AND AFTER LIMITS
C 99=SLUR ABOVE NOTE→PAST END; 98=SLUR AT NOTE LEVEL→PAST END
C 97=SLUR ABOVE NOTE←FROM BEFORE END; 96=SLUR AT NOTE LEVEL←FROM BEFORE END
L=N
IF(N.EQ.99)L=99
IF(N.EQ.98)L=JN+2
35 ISL(J5)=L
C SLUR END POINT
GO TO 200
4 J=J+2
IF(NUMS(I(J+1)))GO TO 42
JC=ISEMI
JD=0
N=1
14 J4=J4+3
IB(J4-2)=I(J-N)
IB(J4-1)=LBB
IB(J4)=JC
IF(JD.EQ.0)GO TO 200
J4=J4+1
IB(J4)=JD
GO TO 200
42 JC=ICHAR(J)
JD=ISEMI
N=2
GO TO 14
7 N=1
74 CALL UPMK(JN+N,0,IBLA)
70 N=ICHAR(J)
IF(N.EQ.IBLA)GO TO 70
IF(NUMS(N).EQ.0)GO TO 73
CALL A2I(J,N)
C CHANGES ASCII TO INTEGER
GO TO 74
C NOW SHOULD BE LETTERS
73 L=J+1
C*********↓↓↓↓↓↓↓↓↓↓↓↓*********************
77 N=I(L)
IF(N.NE.IDOT)GO TO 71
IM(J3)=N
IM(J3+1)=I(L+1)
C ONLY ONE DIGIT TO RIGHT OF DECIMAL IS ALLOWED.
IM(J3+2)=IBLA
J3=J3+2
I(L)=IBLA
L=L+1
I(L)=IBLA
71 IF(N.EQ.IGT.OR.N.EQ.IBLA)GO TO 75
78 L=L+1
IF(L.LE.LND)GO TO 77
75 DO 72 N=J,L-1
J3=J3+1
72 IM(J3)=I(N)
J=L
J3=J3+1
IM(J3)=KSLA
GO TO 76
79 J=J+1
76 IF(I(J).EQ.IGT)GO TO 200
IF(I(J).EQ.IBLA)GO TO 79
C*********↑↑↑↑↑↑↑↑↑↑↑↑*********************
J=J-1
GO TO 7
C*********↓↓↓↓↓↓↓↓↓↓↓↓*********************
80 IF(JC.EQ.IXX)GO TO 81
C SETSUP 1ST PART OF CRESC-DECRESC
CALL CROCT(ICRS,N,JC)
84 J=J+1
GO TO 200
85 CALL CROCT(IOCT,N,IBLA)
GO TO 84
81 CALL CROCX(ICRS)
GO TO 84
86 CALL CROCX(IOCT)
GO TO 84
C*********↑↑↑↑↑↑↑↑↑↑↑↑*********************
301 J=J+2
CODE FOR 'REP N M/'
JC=-1
30 N=ICHAR(J)
IF(N.EQ.IBLA)GO TO 30
CALL A2I(J,N)
IF(JC.GE.0)GO TO 31
JC=N
C JC IS NOW 1ST NUM AFTER REP.
GO TO 30
31 JD=J1
C N IS NOW 2ND NUMBER.
IRP=0
ITM=0
JZ=JC
IF(JZ.GT.100)JZ=JZ-100
C >100 IS FOR 'REP' WITHOUT REPEATING ACCIS.
33 MM=JD
32 JD=JD-1
IF(NTS(JD).NE.KSLA)GO TO 32
C BACK UP TO PREV. SLASH
IF(MM-JD.GT.1)GO TO 39
IRP=IRP+1
GO TO 33
C NOW LOOK FORWARD TO 1ST CHAR. AFTER SLASH
39 MM=NTS(JD+1)
IF(MM.EQ.LRR)GO TO 36
IF(MM.EQ.LOH)GO TO 37
IF(MM.EQ.LPP)GO TO 37
IF(MM.GT.LGG)GO TO 33
37 ITM=ITM+1
36 JZ=JZ-1
38 IF(JZ.GT.0)GO TO 33
JN=JN+ITM*(N-1)
CALL UPLIST(NTS,J1)
GO TO 28
END
SUBROUTINE CROCT(K,N,JC)
DIMENSION K(1)
COMMON NONO(35),J1,J2,J3,J4,J5,JN,J,JJ /ALF/I(1)
1 /SCX/ICOM,MINU,IDOT
C SETSUP 1ST PART OF CRESC-DECRESC, OTTAVA
K(1)=JN+1
K(2)=JC
K(3)=I(J+2)
K(4)=I(J+3)
C K4 SHOULD BE / ; BLANK OR NUM.
IF(K(3).EQ.IDOT)J=J+2
END
SUBROUTINE CROCX(K)
COMMON NONO(35),J1,J2,J3,J4,J5,JN,J,JJ /ALF/I(1)
1/DPY/ST(2190),ICRS(5),IOCT(5),NTS(600),IRH(400),IM(200)
1 /MKX/KSLA /JCHAR/IXX,ISEMX,IBLA
DIMENSION K(1)
81 CALL UPMK(K,K(3),IBLA)
IM(J3+1)=I(J)
IM(J3+2)=K(2)
J3=J3+3
IM(J3)=IBLA
CALL UPMK(JN+1,I(J+2),KSLA)
END
SUBROUTINE UPMK(N,L,LL)
DIMENSION L(1)
COMMON NO(35),J1,J2,J3,J4,J5,JN,J,JJ
1/DPY/ST(2190),ICRS(5),IOCT(5),NTS(600),IRH(400),IM(200)
1 /MKX/KSLA,ISEMI,LESS,IGT,LBRK,IRBRK /NUM/N0
1 /SCX/ICOM,MINU,IDOT
J3=J3+3
CALL I2A(N,MM,M,N)
IM(J3-2)=M
IF(M.EQ.N0)J3=J3-1
IM(J3-1)=N
IF(L(1).NE.IDOT)GO TO 1
IM(J3)=IDOT
J3=J3+2
IM(J3-1)=L(2)
IF(LL.EQ.KSLA)J=J+2
1 IM(J3)=LL
END
SUBROUTINE ONEUP(L,J,N)
DIMENSION L(1)
J=J+1
L(J)=N
END
FUNCTION NUMS(N)
COMMON /NUM/N0,NN(8),N9 /SCX/ICOM,MINU,IDOT
C FINDS ASCII NUMBER (NUMS=-1)
NUMS=0
IF(N.GE.N0.AND.N.LE.N9)NUMS=-1
IF(N.EQ.IDOT)NUMS=-1
C DOT IS CONSIDERED PART OF A NUMBER
END
FUNCTION LETS(N)
COMMON /A2Z/LAA,A(24),LZZ
C FINDS LETTER (LETS=-1)
LETS=0
IF(N.GE.LAA.AND.N.LE.LZZ)LETS=-1
END
FUNCTION ISGN(J)
COMMON NO(35),J1,J2,J3,J4,J5,JN
1 /ALF/I(1) /MKX/NNO(9),MINUS
1 /SCX/ICOM,MINU,IDOT,IEQ,LPRN,IRPRN,IPLUS,ISTAR
ISGN=JN+1
N=I(J+1)
IF(N.EQ.IPLUS)GO TO 1
IF(N.NE.MINUS)RETURN
ISGN=-ISGN
GO TO 2
1 ISGN=ISGN+100
C FOR SLUR AND BEAM STEM REVERSAL
2 J=J+1
END
SUBROUTINE I2A(JN,MM,M,N)
COMMON/NUM/NUM(0/9)
K=JN
N=K/100
MM=NUM(N)
K=K-N*100
N=K/10
M=NUM(N)
N=NUM(K-N*10)
C CHANGES 2-DIGIT NUMBERS TO FROM INTEGER TO ASCII
END
SUBROUTINE A2I(J,N)
COMMON /ALF/I(1) /NUM/NUM(0/9)
L=N
N=0
3 DO 1 K=0,9
1 IF(L.EQ.NUM(K))GO TO 2
2 N=N*10+K
L=I(J+1)
IF(NUMS(L).EQ.0)RETURN
J=J+1
GO TO 3
END
SUBROUTINE UPLIST(N,K)
DIMENSION N(1)
COMMON NONO(35),J1,J2,J3,J4,J5,JN,J,JJ
COMMON /ALF/I(1)
DO 1 L=JJ,J
K=K+1
1 N(K)=I(L)
END
FUNCTION LETNUM(N)
COMMON NONO(35),J1,J2,J3,J4,J5,JN,J,JJ /MKX/MKX(1)
COMMON /ALF/I(1) /NUM/NUM(0/9) /JCHAR/IXX,ISEMX,IBLA
1 IF(N.NE.IBLA)GO TO 2
N=ICHAR(J)
GO TO 1
2 IF(NUMS(N).EQ.0)GO TO 3
4 LETNUM=2
RETURN
3 IF(LETS(N).EQ.0)GO TO 40
CATCHES LETTERS AND MINUS SIGN (FOR INVIS. CLEFS)
7 LETNUM=1
RETURN
40 DO 5 K=1,11
5 IF(N.EQ.MKX(K))GO TO (6,6,9,9,10,10,11,11,4,7,8)K
CCC CALL ERR(J)
6 LETNUM=3
C / ;
RETURN
8 LETNUM=8
C *
RETURN
9 LETNUM=4
C < >
RETURN
10 LETNUM=5
C [ ]]
RETURN
11 LETNUM=K-1
C ( )
END
SUBROUTINE UPCNT
COMMON NONO(35),J1,J2,J3,J4,J5,JN,J,JJ
COMMON /ALF/I(1) /NUM/NUM(0/9) /JCHAR/IXX,ISEMX,IBLA
C GETS LAST NOTE NUM.
K=J
JR=0
1 K=K-1
N=I(K)
IF(NUMS(N))GO TO 1
CALL A2I(K,N)
IF(JR.NE.0)GO TO 4
JN=JN+N-1
RETURN
2 JR=N
3 K=K-1
IF(I(K).EQ.IBLA)GO TO 3
GO TO 1
4 JN=JN+JR*N-N-1
END
SUBROUTINE OUTX(IX,J)
DIMENSION IX(1)
COMMON NONO(35),J1,J2,J3,J4,J5,K,L,MM/NUM/N0,NO(8),N9
1/DPY/ST(2200),NTS(600),IRH(400),IM(200),IB(200),ISL(200)
1 /MKX/KSLA,ISEMI /JCHAR/IXX,ISEMX,IBLA /A2Z/LAA,LBB
1 /SCX/ICOM,MINUS
K=1
IF(J.LE.1)GO TO 4
IF(IX(2).NE.LBB)GO TO 3
C NEXT FOR AUTO-BEAMS (E.G. 2B; 3B1; ETC.)
CALL OUTIT(IX,J)
RETURN
3 DO 6 L=1,J,2
MM=IX(L)
IF(MM.GE.100)GO TO 5
IF(MM.GE.0)GO TO 6
IX(L)=-MM
CHANGE -M,N TO M,-N
IX(L+1)=IX(L+1)+200
GO TO 6
5 IX(L)=MM-100
CHANGES M+100,N TO M,N+100
IX(L+1)=IX(L+1)+100
6 CONTINUE
JJ=IBLA
NN=1
DO 1 L=1,J
LL=IX(L)
CALL I2A(LL,MM,M,N)
IF(LL.LT.96)GO TO 7
IF(LL.GE.99)GO TO 7
IF(LL.EQ.98)GO TO 8
MY=NTS(K-3)
MZ=NTS(K-2)
NTS(K-4)=MINUS
IF(LL.EQ.96)GO TO 10
N=N9
GO TO 11
10 M=N0
N=MZ
11 NTS(K-3)=M
IF(M.EQ.N0)K=K-1
NTS(K-2)=N
M=MY
N=MZ
GO TO 7
C THESE ARE FOR SLURS BEFORE AND AFTER STAFF LIMIT
8 N=N0
M=N0
7 NTS(K)=MM
IF(MM.EQ.N0)K=K-1
NTS(K+1)=M
IF(M.EQ.N0.AND.MM.EQ.N0)K=K-1
NTS(K+2)=N
NTS(K+3)=JJ
JJ=KSLA
IF(NN)JJ=IBLA
NN=-NN
1 K=K+4
K=K-1
4 NTS(K)=ISEMI
DO 2 L=K+1,K+79
2 NTS(L)=IBLA
CALL OUTIT(NTS,K)
END
FUNCTION ICHAR(J)
COMMON /ALF/I(1)
J=J+1
ICHAR=I(J)
END
SUBROUTINE TYPARY(I,K)
DIMENSION I(1)
DO 8 L=1,K
8 CALL TYPCHR(I(L),1)
CALL TYPCRLF
END
SUBROUTINE READ(K)
COMMON NONO(29),JB(6),JP(6) /IDEV/IDEV /JCHAR/IXX,ISEMX,IBLA
COMMON /ALF/I(73) /MKX/KSLA,ISEMI/NUM/NUM(10),JRD
1 /A2Z/AA,BB,LCC,NO(11),LOH
C ALL DATA IN WORDS DATA NUM/'0','1','2','3','4','5','6','7','8','9'/,JRD/0/
EQUIVALENCE (N9,NUM(10))
14 IF(JRD)GO TO 2
IF(IDEV.NE.5)GO TO 1
15 CALL TYPSTR('TYPE @@ ')
CALL TYPCRLF
C IDEV=0 AFTER ';' IS SEEN.
1 READ(IDEV,10,END=2)I
IF(I(1).NE.LCC)GO TO 4
IF(I(2).NE.LOH)GO TO 4
C FOR X!Z% ET DIRECTORY
5 READ(1,10)I
IF(I(3).NE.ISEMI)GO TO 5
GO TO 1
4 IF(I(1).NE.N9)GO TO 11
IF(I(2).NE.N9)GO TO 11
C TYPE '99' TO BACKUP - ONE LINE ONLY EACH TIME.
DO 12 L=1,6
C GET BACK LAST POINTERS
12 JP(L)=JB(L)
IF(IDEV.EQ.5)CALL TYPCHR('RE',2)
GO TO 15
11 DO 16 K=73,1,-1
N=I(K)
16 IF(N.EQ.KSLA.OR.N.EQ.ISEMI)GO TO 17
GO TO 15
17 DO 9 L=1,K
C WIPE OUT COMMAS
9 IF(I(L).EQ.',')I(L)=IBLA
DO 13 L=1,5
C SAVE POINTERS FOR POSSIBLE BACKUP
13 JB(L)=JP(L)
CC DO 3 K=73,1,-1
CC N=I(K)
IF(N.EQ.ISEMI)JRD=-1
CC IF(N.NE.KSLA.AND.N.NE.ISEMI)GO TO 3
IF(IDEV.EQ.5)WRITE(21,10)(I(L),L=1,K)
C SAVE TYPED INPUT ON 'FOR21.DAT'
RETURN
CC3 CONTINUE
CC GO TO 1
C UNTERMINATED LINE (NO / OR ; )IS IGNORED. (FOR COMMENTS)
CC IF(I(1).NE.'@')GO TO 1
C START LINE WITH '@' FOR LITERAL REPRODUCTION.
CCC DO 6 K=73,1,-1
CCC6 IF(I(K).NE.' ')GO TO 7
CCC7 WRITE(23,10)(I(L),L=2,K)
CC TYPE 10,(I(L),L=1,K)
CCC CALL TYPARY(I,K)
CCC GO TO 1
C IGNORES BLANK LINES OR UNTERMINATED LINES.
10 FORMAT(73A1)
2 END FILE 23
IF(IDEV.EQ.5)END FILE 21
JRD=0
K=-1
END
SUBROUTINE OUTIT(I,K)
COMMON /MKX/KSLA,ISEMI /IDEV/IDEV
DIMENSION I(1)
IF(K.EQ.0)K=1
I(K)=';'
M=1
1 N=M+60
DO 2 L=N,M,-1
J=I(L)
2 IF(J.EQ.KSLA.OR.J.EQ.ISEMI)GO TO 3
3 IF(L.GT.K)L=K
WRITE(23,10)(I(J),J=M,L)
CC TYPE 11,(I(J),J=M,L)
CALL TYPARY(I(M),L-M+1)
IF(L.EQ.K)RETURN
M=L+1
GO TO 1
10 FORMAT(70A1)
CC11 FORMAT(1X70A1)
END